#include <iostream>
#include <vector>
#include <algorithm>

/*
std::vector 是封装动态数组的序列容器。

元素被连续存储，这意味着不仅可通过迭代器，还能用指向元素的常规指针访问元素。

vector 的存储是自动管理的，按需扩张收缩。vector 通常占用多于静态数组的空间，
因为要分配更多内存以管理将来的增长。
*/

// 向 vector 中添加元素
void addElements(std::vector<int>& numbers) {
    // 使用 push_back 添加元素到 vector 的末尾
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);
}

// 访问 vector 中的元素
void accessElements(const std::vector<int>& numbers) {
    // 使用索引访问 vector 中的第一个元素
    std::cout << "第一个元素: " << numbers[0] << std::endl;
}

// 遍历并打印 vector 中的所有元素
void traverseVector(const std::vector<int>& numbers) {
    std::cout << "所有元素: ";
    // 使用范围 for 循环遍历 vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}

// 在 vector 的指定位置插入元素
void insertElement(std::vector<int>& numbers) {
    // 使用 insert 在索引 1 位置插入元素 15
    numbers.insert(numbers.begin() + 1, 15);
    std::cout << "插入 15 后: ";
    traverseVector(numbers); // 打印插入后的 vector
}

// 删除 vector 中指定位置的元素
void eraseElement(std::vector<int>& numbers) {
    // 使用 erase 删除索引 1 位置的元素
    numbers.erase(numbers.begin() + 1);
    std::cout << "删除索引 1 的元素后: ";
    traverseVector(numbers); // 打印删除后的 vector
}

// 删除 vector 中的最后一个元素
void removeLastElement(std::vector<int>& numbers) {
    // 使用 pop_back 删除最后一个元素
    numbers.pop_back();
    std::cout << "删除最后一个元素后: ";
    traverseVector(numbers); // 打印删除后的 vector
}

// 检查并打印 vector 的大小
void checkSize(const std::vector<int>& numbers) {
    // 使用 size 获取 vector 的大小
    std::cout << "vector 的大小: " << numbers.size() << std::endl;
}

// 查找 vector 中是否包含指定的元素
void findElement(const std::vector<int>& numbers, int value) {
    // 使用 std::find 查找元素
    auto it = std::find(numbers.begin(), numbers.end(), value);
    if (it != numbers.end()) {
        // 如果找到，打印元素及其索引
        std::cout << "元素 " << value << " 找到了，索引为: " << std::distance(numbers.begin(), it) << std::endl;
    } else {
        // 如果未找到，打印提示信息
        std::cout << "元素 " << value << " 未找到。" << std::endl;
    }
}

int main() {
    // 定义一个整数类型的 vector
    std::vector<int> numbers;

    // 调用函数向 vector 添加元素
    addElements(numbers);

    // 调用函数访问 vector 中的元素
    accessElements(numbers);

    // 调用函数遍历并打印 vector 中的所有元素
    traverseVector(numbers);

    // 调用函数在 vector 中插入元素
    insertElement(numbers);

    // 调用函数删除 vector 中的指定元素
    eraseElement(numbers);

    // 调用函数删除 vector 中的最后一个元素
    removeLastElement(numbers);

    // 调用函数检查 vector 的大小
    checkSize(numbers);

    // 调用函数查找 vector 中的元素
    findElement(numbers, 20); // 查找元素 20
    findElement(numbers, 40); // 查找元素 40

    return 0; // 程序结束
}
